package br.uvv.Web.ManagedBean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.uvv.Model.ClientePortal;
import br.uvv.Model.Usuario;
import br.uvv.Service.SolicitacaoCadastroService;
import br.uvv.Util.InitUtil;
import br.uvv.Util.RNException;
import br.uvv.Util.Util;

public class SolicitacaoCadastroBean implements Serializable {

	private static final long serialVersionUID = -2499438086933269880L;

	private SolicitacaoCadastroService service;
	
	private Usuario usuarioInstance;
	
	private LazyDataModel<ClientePortal> clientePortalList;
	private ClientePortal clientePortalInstance;
	private String varBuscaClientePortal;
	
	private Boolean flagNovoCliente;
	
	public String iniciaWorkFlowCadastro(){
		init();
		return "/views/solicitacaoCadastro/escolhaCliente.xhtml";
	}
	
	private void init(){
		service = new SolicitacaoCadastroService();
		usuarioInstance = new Usuario();
		clientePortalList = InitUtil.inicializaClientePortalList();
		flagNovoCliente = true;
	}
	
	//Recebe False se cliente Já cadastrado
	public String irParaCadastro(Boolean flag){
		flagNovoCliente = flag;
		clientePortalInstance = new ClientePortal();
		usuarioInstance = new Usuario();
		if (flagNovoCliente){
			clientePortalList = InitUtil.inicializaClientePortalList();
			varBuscaClientePortal = null;
		}
		return "/views/solicitacaoCadastro/formCadastro.xhtml";
	}
	
	public String salvar(){
		try {
			if (flagNovoCliente){
				service.salvarClienteAndUsuario(clientePortalInstance, usuarioInstance);
			} else {
				usuarioInstance.setCliente(clientePortalInstance);
				service.salvarUsuario(usuarioInstance);
			} 
		} catch (RNException e) {
			e.printStackTrace();
			return null;
		}
		return "/views/solicitacaoCadastro/sucesso.xhtml";
	}
	
	@SuppressWarnings("serial")
	public void filtrarClientePortal(){
			clientePortalList = new LazyDataModel<ClientePortal>() {
	        @Override
	        public List<ClientePortal> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
	        	Util.setDataTableRows(pageSize);
                try {
					return service.listarClientePortal(first, pageSize, sortField, sortOrder, varBuscaClientePortal);
				} catch (RNException e) {
					e.printStackTrace();
					return new ArrayList<ClientePortal>();
				}
	        }
	        @Override  
	        public ClientePortal getRowData(String rowKey)  
	        {  
	        	try {
	        		return service.selecionarClientePortal(Long.parseLong(rowKey));
	        	} catch (RNException ex){
	        		ex.printStackTrace();
	        		return new ClientePortal(); 
	        	} catch (NumberFormatException e){
	        		return new ClientePortal();
	        	}
	        }  
	        @Override  
	        public String getRowKey(ClientePortal objeto)  
	        {  
	        	if (objeto!=null)
	        		return ""+objeto.getId();
	        	return "";
	        }  
	    };
	    clientePortalList.setRowCount(service.pedidoCount(varBuscaClientePortal));
	    clientePortalList.setPageSize(5);
	}
	
	public void selecionarClientePortal(){
		usuarioInstance.setCliente(clientePortalInstance);
	}
	
	public void cancelarSelecionarClientePortal(){
		varBuscaClientePortal = "";
		clientePortalInstance = new ClientePortal();
		clientePortalList = InitUtil.inicializaClientePortalList();
	}

	public String goHome(){
		return "goHome";
	}
	
	public Integer getActiveIndex(){
		if (flagNovoCliente)
			return 0;
		return 1;
	}
	
	public void setActiveIndex(Integer activeIndex) {
	}
	
	public Usuario getUsuarioInstance() {
		return usuarioInstance;
	}

	public void setUsuarioInstance(Usuario usuarioInstance) {
		this.usuarioInstance = usuarioInstance;
	}

	public LazyDataModel<ClientePortal> getClientePortalList() {
		return clientePortalList;
	}

	public void setClientePortalList(LazyDataModel<ClientePortal> clientePortalList) {
		this.clientePortalList = clientePortalList;
	}

	public ClientePortal getClientePortalInstance() {
		return clientePortalInstance;
	}

	public void setClientePortalInstance(ClientePortal clientePortalInstance) {
		this.clientePortalInstance = clientePortalInstance;
	}

	public String getVarBuscaClientePortal() {
		return varBuscaClientePortal;
	}

	public void setVarBuscaClientePortal(String varBuscaClientePortal) {
		this.varBuscaClientePortal = varBuscaClientePortal;
	}

	public Boolean getFlagNovoCliente() {
		return flagNovoCliente;
	}

	public void setFlagNovoCliente(Boolean flagNovoCliente) {
		this.flagNovoCliente = flagNovoCliente;
	}
	
	public Boolean getFlagNovoClienteENull() {
		if (flagNovoCliente && clientePortalInstance.getId() == null)
			return true;
		return false;
	}
}